.PHONY: all clean rebuild objs

CC = g++
TARGET := run
SRCDIRS := src src/*
OBJDIR  := obj

CFLAGS := -Iinclude -I/data/project/spdlog/include -g -Wall -std=c++14#-O2
CFLAGS += -Wno-deprecated-declarations -Wno-psabi -Wno-unused-function -Wno-sign-compare
CFLAGS += -DSPDLOG_COMPILED_LIB
LFLAGS := -lpthread
# 链接spdlog静态库，也可以拷贝spdlog/src/spdlog.src到工程目录，不用链接直接编译
LFLAGS += -L/data/project/spdlog/build -lspdlog

#vpath %.c $(wildcard $(SRCDIRS))
DIRS := $(shell find src -maxdepth 3 -type d)
VPATH = $(DIRS)

SOURCES := $(foreach d, $(SRCDIRS), $(wildcard $(d)/*.cpp))
OBJS    := $(patsubst %.cpp,$(OBJDIR)/%.o, $(notdir $(SOURCES)))
DEPS    := $(patsubst %.o,%.d, $(OBJS))

all: $(TARGET) | ${OBJDIR}

# $@  表示目標文件
# $^  表示所有的依賴文件
# $<  表示第一個依賴文件
# $?  表示比目標還要新的依賴文件列表
$(TARGET): $(OBJS)
	$(CC) $^ $(LFLAGS) -o $@

$(OBJDIR)/%.o: %.cpp
	$(CC) -c $(CFLAGS) -o $@ $<

$(OBJDIR)/%.d: %.cpp
	@(set -e; rm -f $@;\
	$(CC) -MM $(CFLAGS) $< > $@.$$$$;\
	sed 's,\($*\)\.o[ :]*,$(OBJDIR)/\1.o $@ : ,g' < $@.$$$$ > $@;\
	rm -f $@.$$$$)

-include $(DEPS)

${OBJDIR}:
	@mkdir -p obj

rebuild: clean all start

clean:
	rm -f $(OBJDIR)/*
	rm -f $(TARGET)

debug:
	@echo sources: $(SOURCES)
	@echo objs: $(OBJS)
	@echo deps: $(DEPS)
	@echo $(wildcard $(SRCDIRS))
	@echo $(dir $(SRCDIRS))

objs: $(OBJS)

start: all
	./run thread